/** @手机号码验证
 * 正则验证
 */
export const mobileReg = /^(0|86|17951)?(13[0-9]|15[012356789]|16[0-9]|17[0-9]|18[0-9]|19[0-9]|14[57])[0-9]{8}$/;

/**
 * @手机号码 按照344的划分规则 验证
 * @export
 * @param {any} phone [手机号码]
 * @param {string} [str=''] [返回错误字符串]
 * @returns
 */
export function phoneRule(phone, str = '') {
  if (!mobileReg.test(phone) || !phone) return str;
  return phone.replace(/\B(?=(?:\d{4})+$)/g, '-');
}

/** @邮箱验证
 * 正则验证
 */
export const emailReg = /^[a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*@[a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*\.[a-z]{2,}$/;

/** @身份证号码验证
 * 正则验证
 */
export const identityReg = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;

/** @短信验证码
 * 正则验证
 */
export const smsCode = /(?!^\d+$)(?!^[a-zA-Z]+$)[0-9a-zA-Z]{4}/;

/** @银行卡号位数验证
 * 正则验证
 */
export const bankCodeReg = /^([1-9]{1})(\d{15}|\d{17}|\d{18})$/;

/** @只能输入英文和数字（不区分大小写）
 * 正则验证
 */
export const enterpriseCodeReg = /^[A-Za-z0-9]+$/;

/**
 * 间隔四位输出卡号
 * @export
 * @param {any} value
 * @param {string} [meg='卡号错误，重新输入']
 * @returns
 */
export function bankCodeForthSperae(value, meg = '卡号错误，重新输入') {
  if (!bankCodeReg.test(value)) return meg;
  return value.replace(/\D/g, '').replace(/(....)(?=.)/g, '$1 ');
}

/**@params 中文名字
 * @只能包含中文和. 验证
 * 正则验证
 */
export const nameReg = /^[\u4e00-\u9fa5·]{0,}$/;

/** @只能输入中文和（）（不区分中英文和全半角）
 * 正则验证
 */
export const otherNameReg = /^[\u4e00-\u9fa5()（）]+$/;

/**
 * 只能输入数字 默认4 -- 6位
 * @export
 * @param {any} value
 * @param {string} [str='']
 * @param {number} [m=4]
 * @param {number} [n=6]
 * @returns
 */
export const numberInput = /^\d{4,6}$/;

/**
 * 图片验证码校验
*/
export const imgCode = /^[0-9a-zA-Z]*$/g;

/**
 * 数字、字母或符号
 * @param {any} value
 * @param {string} [str='']
 * @param {number} [m=6]
 * @param {number} [n=32]
 * @returns
 */
export const validatePassword = /^[A-Za-z0-9_\-`~!@#$%\^&*()_\-+=<>?:"{}|,.\/;'\[\]·~！@#￥%……&*（）——\-+={}|《》？：“”【】、；‘'，。、]{6,32}$/;

/**
 * 延迟处理promise
 * @param {*} time 
 * @returns 
 */
export const sleep = time => new Promise(resolve => {
  setTimeout(() => resolve(), time);
});

/**
 * 校验密码强度
 * @param {*} pwString 
 * @returns 
 */
export const testPassword = (pwString) => {
  let strength = 0;
  let msg = '';

  strength += /[A-Z]+/.test(pwString) ? 1 : 0;
  strength += /[a-z]+/.test(pwString) ? 1 : 0;
  strength += /[0-9]+/.test(pwString) ? 1 : 0;
  strength += /[\W]+/.test(pwString) ? 1 : 0;

  switch (strength) {
    case 3:
      msg = '中等';
      break;
    case 4:
      msg = '强';
      break;
    default:
      msg = '弱';
      break;
  }
  return {
    strength,
    msg,
  };
};

export const _toString = Object.prototype.toString;

/**
 * 对象判定判定
 * @param {*} o [o => 复合类型]
 * @reurns boolean
 */
export function isPlainObject(o) {
  return _toString.call(o) === '[object Object]';
}
/**
 * value 转为字符串
 * @param {*} val 
 * @returns 
 */

export function toString(val) {
  return val == null
    ? ''
    : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
      ? JSON.stringify(val, null, 2)
      : String(val)
}

/**
 * 转数字
 * @param {*} val 
 * @returns number
 */
export const toNumber = val => {
  const n = parseFloat(val);
  return isNaN(n) ? val : n;
}

/**
 * toArray 转数组
 * @param {*} list | 类似数组或者数组
 * @param {*} start | 开始位置
 * @returns array
 */
export function toArray(list, start) {
  start = start || 0;
  let i = list.length - start;
  const ret = new Array(i);
  while(i--) {
    ret[i] = list[i + start];
  }
  return ret;
}